package com.example.managemyself;

import android.app.Application;
import android.util.Log;
import com.example.managemyself.data.database.AppDatabase;
import com.example.managemyself.util.DatabaseRepairHelper;

/**
 * 应用程序类
 * 负责全局初始化和异常处理
 */
public class ManageMyselfApplication extends Application {
    
    private static final String TAG = "ManageMyselfApp";
    
    @Override
    public void onCreate() {
        super.onCreate();
        
        Log.i(TAG, "应用程序启动");
        
        // 设置全局异常处理器
        setupGlobalExceptionHandler();
        
        // 预先检查数据库状态
        checkDatabaseHealth();
    }
    
    /**
     * 设置全局异常处理器
     */
    private void setupGlobalExceptionHandler() {
        Thread.setDefaultUncaughtExceptionHandler((thread, throwable) -> {
            Log.e(TAG, "未捕获的异常", throwable);
            
            // 检查是否是数据库相关错误
            if (isDatabaseError(throwable)) {
                Log.w(TAG, "检测到数据库错误，尝试修复");
                try {
                    DatabaseRepairHelper.repairDatabaseMigrationError(this);
                } catch (Exception e) {
                    Log.e(TAG, "数据库修复失败", e);
                }
            }
            
            // 调用系统默认处理器
            System.exit(1);
        });
    }
    
    /**
     * 检查数据库健康状态
     */
    private void checkDatabaseHealth() {
        try {
            // 尝试初始化数据库
            AppDatabase.getInstance(this);
            Log.i(TAG, "数据库健康检查通过");
        } catch (Exception e) {
            Log.w(TAG, "数据库健康检查失败: " + e.getMessage());
            
            if (isDatabaseError(e)) {
                try {
                    DatabaseRepairHelper.repairDatabaseMigrationError(this);
                    Log.i(TAG, "数据库预修复完成");
                } catch (Exception repairError) {
                    Log.e(TAG, "数据库预修复失败", repairError);
                }
            }
        }
    }
    
    /**
     * 判断是否为数据库相关错误
     */
    private boolean isDatabaseError(Throwable throwable) {
        String message = throwable.getMessage();
        if (message == null) return false;
        
        return message.contains("duplicate column") ||
               message.contains("SQLiteException") ||
               message.contains("database") ||
               message.contains("migration") ||
               message.contains("Room");
    }
} 